package org.tea.application.service;

import org.tea.application.ipc.BaseIpcMessage;

import java.util.concurrent.TimeUnit;

/**
 * 用于实现进程间通信的相关服务类
 *
 * @author lxh
 */
public interface IPCService<T> {

    /**
     * 发送相关的消息到对应的主题 {@code topic} 中，使得关注这一主题的进程能够收到这一消息
     *
     * @param topic 待发送的消息的目标主题
     * @param msg 待发送的消息对象
     * @return 如果发送成功，则返回 {@code true}，否则，返回 {@code false}
     */
    boolean publish(String topic, T msg);

    /**
     * 当前的进程在主题 {@code topic} 等待即将到来的消息，在改主题未收到消息前会将当前线程挂起
     *
     * @param topic 待订阅的主题
     * @return 在当前主题上收到的消息
     */
    BaseIpcMessage<T> subscribe(String topic);

    /**
     * 同 {@link #subscribe(String)}，区别在于当等待时间超过最大等待时间时，将会停止等待
     *
     * @param topic 待订阅的主题
     * @param maxWaitTimes 最大等待时间
     * @param unit 等待时间的单位
     * @return 如果在最大等待时间内成功订阅到消息，则返回订阅的主题的消息对象，否则，返回 {@code null}
     */
    BaseIpcMessage<T> subscribe(String topic, long maxWaitTimes, TimeUnit unit);
}